使用过SpringBoot的同学,都知道java -jar application.jar
就可以启动一个tomcat应用,十分的简单。之所这么方便,是因为SpringBoot帮我们整合了Embedded Tomcat,那么Native Tomcat和Embedded的相比,有什么差别呢?是不是Embedded Tomcat比Native版的差太多?
前言
使用过SpringBoot的同学,都知道java -jar application.jar
就可以启动一个tomcat应用,十分的简单。之所这么方便,是因为SpringBoot帮我们整合了Embedded Tomcat,那么Native Tomcat和Embedded的相比,有什么差别呢?是不是Embedded Tomcat比Native版的差太多?
话说Embedded Tomcat
Connector
要讲Embedded和Native版的区别,先要了解tomcat的Connector:
- BIO 即同步阻塞式I/O,每一个请求,都会创建一个线程来处理,在高并发的场景下不适合。
- NIO 即同步非阻塞I/O,在Java中,采用的多路复用I/O(epoll),适合高并发场景。
- NIO2 即异步非阻塞I/O,在NIO的基础上,进一步提高I/O的性能。
- APR/native APR全称是Apache Portable Runtime,是一个高度可移植的库,APR有许多用途,包括访问高级IO功能(例如sendfile,epoll和OpenSSL),操作系统级别的功能(生成随机数,系统状态等)以及本机进程处理(共享内存,NT管道和Unix套接字)。这些功能使Tomcat成为通用的Web服务器,可以更好地与其他本机Web技术集成,并且总体上使Java作为完整的Web服务器平台而不是仅以后端为中心的技术,更加可行。可以认为,APR是NIO的操作系统级别的实现,理论上比NIO要快一些。
##区别&Embedded利好
从Tomcat7.0开始,Embedded版本便与Native版的一同发布,不过官方文档上没有介绍Embedded Tomcat的特性,理论上源码是一套,只是适配层略有区别。而已知的最大区别,便是Embedded不支持APR,换句话说,如果你不使用APR,那么Embedded和Native版是没什么区别的!这个很重要,如果没有区别,谁还会在服务器上安装tomcat,还需要打WAR包扔到tomcat目录下等等繁琐的操作。在SpringBoot中,只需要java -jar app.jar
,就能启动一个高性能应用,岂不美哉。
而且在网上搜到一封tomcat开发团队的一封邮件,就是关于在Tomcat10中废弃APR的讨论)。我们拭目以待吧。总之放心用内置版tomcat吧